#include <iostream>
using namespace std;

//关键字 ： static



//静态成员函数 ： 所有对象共享一份数据  静态成员函数只能访问静态成员变量，不能访问非静态成员变量
//1.静态成员函数只能通过类名访问，不能通过对象访问
//2.静态成员函数只能访问静态成员变量，不能访问非静态成员变量
//3.静态成员函数不能有this指针
//4.静态成员函数不能有返回值


// 静态成员变量示例代码
class Person {
public:
    // 类内声明静态成员变量
    static int M_a;

    // 构造函数示例
    Person() {
        cout << "Constructor called, M_a = " << M_a << endl;
    }
};

// 类外初始化静态成员变量（编译阶段分配内存）
int Person::M_a = 10;

void test01() {
    // 通过类名访问静态成员变量
    cout << "Person::M_a = " << Person::M_a << endl;

    // 创建对象实例
    Person p1;
    cout << "p1.M_a = " << p1.M_a << endl;  // 实际上仍属于类，所有对象共享该变量

    Person p2;
    p2.M_a = 20;
    cout << "After modification via p2: " << endl;
    cout << "Person::M_a = " << Person::M_a << endl;
    cout << "p1.M_a = " << p1.M_a << endl;  // 所有对象共享，因此值也变为20
}

// 静态成员函数示例代码
class Person2 {
public:
    // 静态成员函数示例
    static void printStaticMember() {
        cout << "Static member function called, M_a = " << M_b << endl;
    }

    // 静态成员变量示例
    static int M_b;
};
int Person2 :: M_b = 40;

void test02() {
    // 通过类名访问静态成员函数
    Person2::printStaticMember();

    // 创建对象实例
    Person2 p1;
    p1.printStaticMember();  // 实际上仍属于类，所有对象共享该函数
}

int main() {
    test01();
    cout  << endl << endl;
    test02();
    return 0;
}